home *** CD-ROM | disk | FTP | other *** search
/ Network CD 2 / Network CD - Volume 2.iso / programs / internet / dnet / dnetsolaris.lzh / server / scopy.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-12  |  3.0 KB  |  166 lines

  1.  
  2. /*
  3.  *    SCOPY.C
  4.  *
  5.  *    DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved
  6.  *
  7.  *    Remote file copy server (putfiles is the client program)
  8.  */
  9.  
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <sys/wait.h>
  13. #include <sys/time.h>
  14. #include <sys/file.h>
  15. #include <sys/resource.h>
  16. #include <stdio.h>
  17. #include <errno.h>
  18. #include <signal.h>
  19.  
  20. #include "servers.h"
  21. #include "../lib/dnetlib.h"
  22.  
  23. char Buf[4096];
  24.  
  25. chandler()
  26. {
  27.     union wait stat;
  28.     struct rusage rus;
  29.     while (wait3(&stat, WNOHANG, &rus) > 0);
  30. }
  31.  
  32. main(ac,av)
  33. char *av[];
  34. {
  35.     long chann = DListen(PORT_FILECOPY);
  36.     int fd;
  37.     int n;
  38.     char buf[256];
  39.     extern int errno;
  40.  
  41.     elog(EDEBUG, "SCOPY START", 0);
  42.     if (av[1])
  43.         chdir(av[1]);
  44.     signal(SIGCHLD, chandler);
  45.     signal(SIGPIPE, SIG_IGN);
  46.     for (;;) {
  47.     fd = DAccept(chann);
  48.     if (fd < 0)
  49.         break;
  50.         elog(EDEBUG, "SCOPY CONNECT", 0);
  51.     if (fork() == NULL) {
  52.         putdir(fd, "."); 
  53.         _exit(1);
  54.     }
  55.     close(fd);
  56.     }
  57.     perror("SCOPY");
  58. }
  59.  
  60. putdir(chan, dirname)
  61. char *dirname;
  62. {
  63.     struct stat stat;
  64.     char olddir[256];
  65.     char co, nl, name[128];
  66.     long len;
  67.     int ret = -1;
  68.  
  69.     getwd(olddir);
  70.     if (lstat(dirname, &stat) >= 0 && !(stat.st_mode & S_IFDIR)) {
  71.     char rc = 'N';
  72.     gwrite(chan, &rc, 1);
  73.     elog(EWARN, "SCOPY: Unable to cd to dir '%s'", dirname);
  74.     return(1);
  75.     }
  76.     if (chdir(dirname) < 0) {
  77.     if (mkdir(dirname, 0777) < 0 || chdir(dirname) < 0) {
  78.         char rc = 'N';
  79.         elog(EWARN, "SCOPY: Unable to create directory '%s'", dirname);
  80.         gwrite(chan, &rc, 1);
  81.         return(1);
  82.     }
  83.     }
  84.     co = 'Y';
  85.     gwrite(chan, &co, 1);
  86.     while (ggread(chan, &co, 1) == 1) {
  87.     if (ggread(chan, &nl, 1) != 1 || ggread(chan, name, nl) != nl)
  88.         break;
  89.     if (ggread(chan, &len, 4) != 4)
  90.         break;
  91.     len = ntohl68(len);
  92.     switch(co) {
  93.     case 'C':
  94.         co = 'Y';
  95.             if (chdir(name) < 0) {
  96.         if (mkdir(name, 0777) < 0 || chdir(name) < 0)  {
  97.             co = 'N';
  98.                 elog(EWARN, "SCOPY: Unable to create directory '%s'", 
  99.             dirname);
  100.         }
  101.         }
  102.         gwrite(chan, &co, 1);
  103.         break;
  104.     case 'W':
  105.         if (putfile(chan, name, len) < 0) {
  106.         ret = -1;
  107.         elog(EWARN, "SCOPY: Failure on file %.*s", len, name);
  108.         goto fail;
  109.         }
  110.         break;
  111.     case 'X':
  112.         if (putdir(chan, name) < 0) {
  113.         ret = -1;
  114.         goto fail;
  115.         }
  116.         break;
  117.     case 'Y':
  118.         ret = 1;
  119.         co = 'Y';
  120.         gwrite(chan, &co, 1);
  121.         goto fail;
  122.     default:
  123.         co = 'N';
  124.         gwrite(chan, &co, 1);
  125.         break;
  126.     }
  127.     }
  128. fail:
  129.     chdir(olddir);
  130.     return(ret);
  131. }
  132.  
  133. putfile(chan, name, len)
  134. char *name;
  135. {
  136.     long fd = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0666);
  137.     long n, r;
  138.     char rc;
  139.  
  140.     if (fd < 0) {
  141.     rc = 'N';
  142.     gwrite(chan, &rc, 1);
  143.     return(0);
  144.     }
  145.     rc = 'Y';
  146.     gwrite(chan, &rc, 1);
  147.     while (len) {
  148.     r = (len > sizeof(Buf)) ? sizeof(Buf) : len;
  149.     n = ggread(chan, Buf, r);
  150.     if (n != r)
  151.         break;
  152.         if (write(fd, Buf, n) != n)
  153.         break;
  154.     len -= n;
  155.     }
  156.     close(fd);
  157.     if (len) {
  158.     unlink(name);
  159.     return(-1);
  160.     }
  161.     rc = 'Y';
  162.     gwrite(chan, &rc, 1);
  163.     return(0);
  164. }
  165.  
  166.